﻿Imports System.Xml
Imports Microsoft.Office.Interop
Imports System.IO
Imports System.Drawing

Public Class Gestor

#Region "Stephan"

    ''' <summary>
    ''' Realiza la asignación general de la bonificación de un empleado
    ''' </summary>
    ''' <param name="p_idUsuario">Id del usuario</param>
    ''' <param name="p_bonificacion">Bonificacion</param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 13/06/2010, Modificado: 13/06/2010.</remarks>
    Public Shared Sub asignarBonificacionGeneral(ByVal p_idUsuario As String, ByVal p_bonificacion As Integer)
        Dim bonificacion As Double

        bonificacion = p_bonificacion / 100

        MultiBonificacion.asignarBonificacionGeneral(p_idUsuario, bonificacion)

    End Sub

    ''' <summary>
    ''' Realiza la asignación de las bonificaciones de la meta de un empleado
    ''' </summary>
    ''' <param name="p_idUsuario">Id del usuario</param>
    ''' <param name="p_bonificacion">porcentaje de la bonificación</param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 13/06/2010, Modificado: 13/06/2010.</remarks>
    Public Shared Sub asignarBonificacionMetas(ByVal p_idUsuario As String, ByVal p_bonificacion As Integer)
        Dim bonificacion As Double

        bonificacion = p_bonificacion / 100

        MultiBonificacion.asignarBonificacionMeta(p_idUsuario, bonificacion)

    End Sub

    ''' <summary>
    ''' Generar un archivo XML, con los datos de las cuenta contables y los movimientos de estas.
    ''' </summary>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 16/06/2010, Modificado: 24/06/2010.</remarks>
    Public Shared Sub generarArchivoXML(ByVal p_path As String)
        Dim listaCuentaContables As New List(Of CuentaContable)

        Try

            Dim enc As System.Text.Encoding = Nothing
            Dim objXMLTW As New XmlTextWriter(p_path, enc)
            objXMLTW.WriteStartDocument()
            objXMLTW.WriteStartElement("DocumentoXML")

            objXMLTW.WriteStartElement("Cuentas_Contables")

            listaCuentaContables = MultiCuentaContable.consultar("")

            For i As Integer = 0 To listaCuentaContables.Count - 1


                objXMLTW.WriteStartElement("Cuenta_Contable")

                objXMLTW.WriteStartElement("Codigo")
                objXMLTW.WriteString(listaCuentaContables(i).codigo)
                objXMLTW.WriteEndElement()

                objXMLTW.WriteStartElement("Descripcion")
                objXMLTW.WriteString(listaCuentaContables(i).descripcion)
                objXMLTW.WriteEndElement()

                objXMLTW.WriteStartElement("Saldo")
                objXMLTW.WriteString(listaCuentaContables(i).saldo)
                objXMLTW.WriteEndElement()

                Dim listaMovimientos As New List(Of Movimiento)

                listaMovimientos = MultiMovimiento.buscarMovimientos(listaCuentaContables(i).codigo)

                For j As Integer = 0 To listaMovimientos.Count - 1

                    objXMLTW.WriteStartElement("Movimiento")

                    objXMLTW.WriteStartElement("Codigo_Movimiento")
                    objXMLTW.WriteString(listaMovimientos(j).codigoMovimientoM)
                    objXMLTW.WriteEndElement()

                    objXMLTW.WriteStartElement("Fecha")
                    objXMLTW.WriteString(listaMovimientos(j).fechaM)
                    objXMLTW.WriteEndElement()

                    objXMLTW.WriteStartElement("Monto")
                    objXMLTW.WriteString(listaMovimientos(j).montoM)
                    objXMLTW.WriteEndElement()

                    objXMLTW.WriteStartElement("Tipo")
                    objXMLTW.WriteString(listaMovimientos(j).tipoM)
                    objXMLTW.WriteEndElement()

                    objXMLTW.WriteStartElement("Eliminado")
                    objXMLTW.WriteString(listaMovimientos(j).eliminadoM)
                    objXMLTW.WriteEndElement()

                    objXMLTW.WriteEndElement() 'Fin Movimiento
                Next

                objXMLTW.WriteEndElement() 'Fin cuenta contable


            Next

            objXMLTW.WriteEndElement() 'Fin cuentas_Contables

            '--------------------------------------------------------

            objXMLTW.WriteStartElement("Salarios")

            Dim listaSalarios As List(Of Salario) = MultiSalario.buscarSalarios()

            For k As Integer = 0 To listaSalarios.Count - 1


                objXMLTW.WriteStartElement("Salario")


                objXMLTW.WriteStartElement("Codigo_Empleado")
                objXMLTW.WriteString(listaSalarios(k).codigoEmpleadoS)
                objXMLTW.WriteEndElement()

                objXMLTW.WriteStartElement("Fecha")
                objXMLTW.WriteString(listaSalarios(k).fechaS)
                objXMLTW.WriteEndElement()

                objXMLTW.WriteStartElement("Salario_Bruto")
                objXMLTW.WriteString(listaSalarios(k).salarioBrutoS)
                objXMLTW.WriteEndElement()

                objXMLTW.WriteStartElement("Salario_Neto")
                objXMLTW.WriteString(listaSalarios(k).salarioNetoS)
                objXMLTW.WriteEndElement()

                objXMLTW.WriteStartElement("Bono_Valor")
                objXMLTW.WriteString(listaSalarios(k).bonoValorS)
                objXMLTW.WriteEndElement()


                objXMLTW.WriteEndElement() ' Fin Salario

            Next

            objXMLTW.WriteEndElement() ' Fin Salarios


            objXMLTW.WriteEndElement() ' fin documentXML
            objXMLTW.WriteEndDocument() 'Fin del documento
            objXMLTW.Flush() 'Escribir al archivo
            objXMLTW.Close()

        Catch Ex As Exception

        End Try

    End Sub

    ''' <summary>
    ''' Agregar un nuevo movimiento movimiento.
    ''' </summary>
    ''' <param name="p_codCuentaContable">Codigo de la cuenta contable</param>
    ''' <param name="p_fecha">fecha del dia del movimiento</param>
    ''' <param name="p_monto">monto del movimiento</param>
    ''' <param name="p_tipoMovimiento">tipo de movimiento</param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 16/06/2010, Modificado: 21/06/2010.</remarks>
    Public Shared Sub agregarMovimiento(ByVal p_codCuentaContable As String, ByVal p_fecha As Date, ByVal p_monto As Double, ByVal p_tipoMovimiento As String)
        Dim objCuentaContable As CuentaContable
        Dim saldoCuentaContable As Double

        MultiMovimiento.agregar(p_codCuentaContable, p_fecha, p_monto, p_tipoMovimiento)

        objCuentaContable = MultiCuentaContable.buscar(p_codCuentaContable)

        saldoCuentaContable = objCuentaContable.saldo

        If p_tipoMovimiento = "Debe" Then
            saldoCuentaContable = saldoCuentaContable - p_monto
        ElseIf p_tipoMovimiento = "Haber" Then
            saldoCuentaContable = saldoCuentaContable + p_monto
        End If

        MultiCuentaContable.modificar(p_codCuentaContable, objCuentaContable.descripcion, saldoCuentaContable)


    End Sub

    ''' <summary>
    ''' Realiza el aumento salarial de los puestos y niveles
    ''' </summary>
    ''' <param name="p_porcentajeAumento">Porcentaje del aumento</param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 20/06/2010, Modificado: 20/06/2010.</remarks>
    Public Shared Sub aumentoSalarial(ByVal p_porcentajeAumento As Integer)
        Dim aumentoSalarial As Double = p_porcentajeAumento / 100
        Dim drPuesto As IDataReader = MultiPuesto.listarDR()
        Dim listaPuesto As New List(Of Puesto)


        While drPuesto.Read
            listaPuesto.Add(cargarPuesto(drPuesto))
        End While

        For i As Integer = 0 To listaPuesto.Count - 1

            Dim salarioAumentado As Double = calculoAumentoSalario(listaPuesto(i).Salario, aumentoSalarial)
            MultiPuesto.aumentoSalarial(salarioAumentado, listaPuesto(i).Codigo)

        Next

        Dim listaNiveles As New List(Of Nivel)
        listaNiveles = MultiNivel.buscarNiveles

        For i As Integer = 0 To listaNiveles.Count - 1

            Dim salarioMinimoAumentado As Double = calculoAumentoSalario(listaNiveles(i).SalarioMinimo, aumentoSalarial)
            Dim salarioMaximoAumentado As Double = calculoAumentoSalario(listaNiveles(i).SalarioMaximo, aumentoSalarial)
            MultiNivel.modificarSalarios(salarioMinimoAumentado, salarioMaximoAumentado, listaNiveles(i).Codigo)

        Next

    End Sub

    ''' <summary>
    ''' Convierte el manual de puesto en vites y los envia la multi para insertarlo a la base de datos
    ''' </summary>
    ''' <param name="p_manualPuesto">Manual de puesto</param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 21/06/2010, Modificado: 21/06/2010.</remarks>
    Public Shared Sub cargarManualPuesto(ByVal p_manualPuesto As String)
        Dim manualPuesto() As Byte
        manualPuesto = Utils.object2Byte(p_manualPuesto)
        MultiConfiguracion.cargarManualPuesto(manualPuesto)
    End Sub

    ''' <summary>
    ''' Devuelve el manual de puesto como un documento word.
    ''' </summary>
    ''' <returns>Documento word.</returns>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 21/06/2010, Modificado: 21/06/2010.</remarks>
    Public Shared Function descargarManualPuesto() As Word.Document
        Return MultiConfiguracion.descargarManualPuesto()
    End Function

    ''' <summary>
    ''' Resive un número que representa el mes y lo envia al multi para conseguir la suma de los saldos netos de los empleados.
    ''' </summary>
    ''' <param name="p_mes">Valor numero del mes</param>
    ''' <returns>Double</returns>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 20/06/2010, Modificado: 20/06/2010.</remarks>
    Public Shared Function generarPlanilla(ByVal p_mes As Integer) As Double
        Return MultiSalario.aplicarPlanilla(p_mes)
    End Function

    ''' <summary>
    ''' Revisa si ya se ha echo el pago por el mes
    ''' </summary>
    ''' <returns>Boolean</returns>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 24/06/2010, Modificado: 28/06/2010.</remarks>
    Public Shared Function validarUltimoSalario() As Boolean
        Dim objSalario As Salario = Nothing
        Dim fechaActual As Date = Now.Date
        Dim resultadoFinal As Boolean = False
        Dim annoActual As Boolean = False
        Dim mesActual As Boolean = False

        objSalario = MultiSalario.buscarSalario()

        If fechaActual.Month = objSalario.fechaS.Month Then
            mesActual = True
        End If

        If fechaActual.Year = objSalario.fechaS.Year Then
            annoActual = True
        End If

        If annoActual = True And mesActual = True Then
            resultadoFinal = True
        End If

        Return resultadoFinal
    End Function

    ''' <summary>
    ''' Agrega el total del salario de un empleado, dependiendo en su total de ventas y su porcentaje de comicion
    ''' </summary>
    ''' <param name="p_ventas">Valor de las ventas</param>
    ''' <param name="p_comicion">porcentaje de comición</param>
    ''' <param name="p_codigoUsuario">Código del usuario</param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 30/06/2010, Modificado: 30/06/2010.</remarks>
    Public Shared Function calcularSalarioVariable(ByVal p_ventas As Double, ByVal p_comicion As Integer, ByVal p_codigoUsuario As String) As Double
        Dim comicion As Double = p_comicion / 100
        Dim salarioAIngresar As Double = p_ventas * comicion
        Dim salarioActual As Double = 0
        Dim objUsuario As Usuario = MultiUsuario.buscar(p_codigoUsuario)
        Dim objPuesto As Puesto = objUsuario.puesto

        If objPuesto.TipoSalario = 2 Then

            salarioActual = objPuesto.Salario
            salarioAIngresar = salarioActual + salarioAIngresar
        End If
        Return salarioAIngresar
    End Function

#Region "Realizar Pago"

    ''' <summary>
    ''' Realiza el calculo y movimientos referente a los pagos de los empleados
    ''' </summary>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 24/06/2010, Modificado: 28/06/2010.</remarks>
    Public Shared Sub realizarPagoFijo()
        Dim listaObjCargasSociales As List(Of CargasSociales)
        Dim listaUsuario As New List(Of Usuario)

        Dim totalPorcentajeCCSS As Double = 0
        Dim totalPorcentajeTrabajador As Double = 0
        Dim totalPorcentajeOtrosPatronos As Double = 0
        Dim totalPorcentajeOtrosTrabajador As Double = 0

        listaUsuario = MultiUsuario.buscarUsuariosSalarioFijo()
        listaObjCargasSociales = MultiCargasSociales.buscar()

        For i As Integer = 0 To listaUsuario.Count - 1
            Dim objPuesto As Puesto
            Dim salarioBase As Double
            Dim salarioNeto As Double
            Dim valorBonificacionTotal As Double
            Dim valorBonificacionMeta, valorBonificacionGeneral As Double
            Dim bonificacionMetas, bonificacionGeneral As Double
            Dim porcentajeCCSS As Double = 0
            Dim porcentajeTrabajador As Double = 0
            Dim porcentajeOtrosPatronos As Double = 0
            Dim porcentajeOtrosTrabajador As Double = 0

            objPuesto = listaUsuario(i).puesto

            salarioBase = objPuesto.Salario

            bonificacionMetas = MultiBonificacion.obtenerBonificacionMeta(listaUsuario(i).identificacion)
            bonificacionGeneral = MultiBonificacion.obtenerBonificacionGeneral(listaUsuario(i).identificacion)

            ' Calculo bonificaciones

            valorBonificacionMeta = salarioBase * bonificacionMetas

            valorBonificacionGeneral = salarioBase * bonificacionGeneral

            valorBonificacionTotal = valorBonificacionMeta + valorBonificacionGeneral


            ' Calculo porcentajes sociales, etc

            porcentajeCCSS = salarioBase * listaObjCargasSociales(0).porcentCCSS

            porcentajeTrabajador = salarioBase * listaObjCargasSociales(0).porcentTrab

            porcentajeOtrosPatronos = salarioBase * listaObjCargasSociales(0).otrosPatrono

            porcentajeOtrosTrabajador = salarioBase * listaObjCargasSociales(0).otrosTrabajador

            ' ----- Se guardan los valores en los totales
            totalPorcentajeCCSS += salarioBase * listaObjCargasSociales(0).porcentCCSS

            totalPorcentajeTrabajador += salarioBase * listaObjCargasSociales(0).porcentTrab

            totalPorcentajeOtrosPatronos += salarioBase * listaObjCargasSociales(0).otrosPatrono

            totalPorcentajeOtrosTrabajador += salarioBase * listaObjCargasSociales(0).otrosTrabajador

            ' Calculo salario neto

            salarioNeto = salarioBase

            salarioNeto -= porcentajeCCSS
            salarioNeto -= porcentajeTrabajador
            salarioNeto -= porcentajeOtrosPatronos
            salarioNeto -= porcentajeOtrosTrabajador

            salarioNeto += valorBonificacionTotal

            ' Se guarda el registro

            MultiSalario.registrar(listaUsuario(i).identificacion, Now.Date, salarioBase, salarioNeto, valorBonificacionTotal)


        Next

        agregarMovimiento(0, Now.Date, totalPorcentajeCCSS, "Debe")
        agregarMovimiento(1, Now.Date, totalPorcentajeTrabajador, "Debe")
        agregarMovimiento(2, Now.Date, totalPorcentajeOtrosPatronos, "Debe")
        agregarMovimiento(3, Now.Date, totalPorcentajeOtrosTrabajador, "Debe")

    End Sub

    ''' <summary>
    ''' Realiza el pago de los usuarios que poseen un salario variable
    ''' </summary>
    ''' <param name="p_listaUsuarios"></param>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 06/07/2010, Modificado: 06/07/2010.</remarks>
    Public Shared Sub realizarPagoVariables(ByVal p_listaUsuarios As List(Of Object))
        Dim listaObjCargasSociales As List(Of CargasSociales)
        Dim listaUsuario As List(Of Object) = p_listaUsuarios

        Dim totalPorcentajeCCSS As Double = 0
        Dim totalPorcentajeTrabajador As Double = 0
        Dim totalPorcentajeOtrosPatronos As Double = 0
        Dim totalPorcentajeOtrosTrabajador As Double = 0

        listaObjCargasSociales = MultiCargasSociales.buscar()

        For i As Integer = 0 To p_listaUsuarios(0).Count - 2

            Dim salarioBase As Double
            Dim salarioNeto As Double
            Dim valorBonificacionTotal As Double
            Dim valorBonificacionMeta, valorBonificacionGeneral As Double
            Dim bonificacionMetas, bonificacionGeneral As Double
            Dim porcentajeCCSS As Double = 0
            Dim porcentajeTrabajador As Double = 0
            Dim porcentajeOtrosPatronos As Double = 0
            Dim porcentajeOtrosTrabajador As Double = 0

            salarioBase = p_listaUsuarios(1)(i)

            bonificacionMetas = MultiBonificacion.obtenerBonificacionMeta(listaUsuario(0)(i))
            bonificacionGeneral = MultiBonificacion.obtenerBonificacionGeneral(listaUsuario(0)(i))

            ' Calculo bonificaciones

            valorBonificacionMeta = salarioBase * bonificacionMetas

            valorBonificacionGeneral = salarioBase * bonificacionGeneral

            valorBonificacionTotal = valorBonificacionMeta + valorBonificacionGeneral


            ' Calculo porcentajes sociales, etc

            porcentajeCCSS = salarioBase * listaObjCargasSociales(0).porcentCCSS

            porcentajeTrabajador = salarioBase * listaObjCargasSociales(0).porcentTrab

            porcentajeOtrosPatronos = salarioBase * listaObjCargasSociales(0).otrosPatrono

            porcentajeOtrosTrabajador = salarioBase * listaObjCargasSociales(0).otrosTrabajador

            ' ----- Se guardan los valores en los totales
            totalPorcentajeCCSS += salarioBase * listaObjCargasSociales(0).porcentCCSS

            totalPorcentajeTrabajador += salarioBase * listaObjCargasSociales(0).porcentTrab

            totalPorcentajeOtrosPatronos += salarioBase * listaObjCargasSociales(0).otrosPatrono

            totalPorcentajeOtrosTrabajador += salarioBase * listaObjCargasSociales(0).otrosTrabajador

            ' Calculo salario neto

            salarioNeto = salarioBase

            salarioNeto -= porcentajeCCSS
            salarioNeto -= porcentajeTrabajador
            salarioNeto -= porcentajeOtrosPatronos
            salarioNeto -= porcentajeOtrosTrabajador

            salarioNeto += valorBonificacionTotal

            ' Se guarda el registro

            MultiSalario.registrar(listaUsuario(0)(i), Now.Date, salarioBase, salarioNeto, valorBonificacionTotal)


        Next

        agregarMovimiento(0, Now.Date, totalPorcentajeCCSS, "Debe")
        agregarMovimiento(1, Now.Date, totalPorcentajeTrabajador, "Debe")
        agregarMovimiento(2, Now.Date, totalPorcentajeOtrosPatronos, "Debe")
        agregarMovimiento(3, Now.Date, totalPorcentajeOtrosTrabajador, "Debe")

    End Sub

    ''' <summary>
    ''' Realiza la busqueda de aquellos empleados que poseen un salario variable
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 06/07/2010, Modificado: 06/07/2010.</remarks>
    Public Shared Function buscarEmpleadosTipoVariables() As List(Of Hashtable)
        Dim usuarios As New List(Of Hashtable)
        Dim usuarioTemp As Hashtable
        Dim usuariosObj As List(Of Usuario)

        usuariosObj = MultiUsuario.buscarUsuarioPorTipoVariable()

        For Each usuario As Usuario In usuariosObj
            Dim nombreDepartamento As String = Nothing

            usuarioTemp = usuario.toHashtable

            usuarios.Add(usuarioTemp)
        Next

        Return usuarios
    End Function

#End Region

#Region "Sistema"

    ''' <summary>
    ''' Resive un salario que desea aumentar y el valor por cuanto lo quiere aumentar, realiza el calculo y devuelve el salario aumentado
    ''' </summary>
    ''' <param name="p_salario">salario</param>
    ''' <param name="p_aumentoSalarial">valor del aumento</param>
    ''' <returns>Double</returns>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 20/06/2010, Modificado: 20/06/2010.</remarks>
    Private Shared Function calculoAumentoSalario(ByVal p_salario As Double, ByVal p_aumentoSalarial As Double) As Double
        Dim salarioAumentado As Double = p_salario
        Dim cantidadAumento As Double

        cantidadAumento = p_salario * p_aumentoSalarial

        salarioAumentado = salarioAumentado + cantidadAumento

        Return salarioAumentado

    End Function

    ''' <summary>
    ''' Resive un data reader de puesto y crea un objeto puesto
    ''' </summary>
    ''' <param name="dr">Un data reader de puesto</param>
    ''' <returns>Puesto</returns>
    ''' <remarks>Creador por: Stephan Endres, Fecha: 20/06/2010, Modificado: 20/06/2010.</remarks>
    Private Shared Function cargarPuesto(ByVal dr As IDataReader) As Puesto
        Dim objPuesto As Puesto
        With dr
            objPuesto = New Puesto(CInt(.Item("codigo")), CStr(.Item("nombre")), CStr(.Item("descripcion")), CInt(.Item("codigo_nivel")), CInt(.Item("tipo_salario")), CDbl(.Item("salario")))
        End With
        Return objPuesto
    End Function

#End Region

#End Region

#Region "Elías Baldioceda"
    ''' <summary>
    ''' Registrar usuario.
    ''' </summary>
    ''' <param name="p_tipoId">Tipo de identificación.</param>
    ''' <param name="p_identificacion">Identificación.</param>
    ''' <param name="p_nombre">Nombre.</param>
    ''' <param name="p_primerApellido">Primero apellido.</param>
    ''' <param name="p_segundoApellido">Segundo apellido.</param>
    ''' <param name="p_genero">Género.</param>
    ''' <param name="p_fechaNacimiento">Fecha de nacimiento.</param>
    ''' <param name="p_correo">Correo electrónico.</param>
    ''' <param name="p_telefono">Teléfono.</param>
    ''' <param name="p_rol">Código del rol.</param>
    ''' <param name="p_foto">Foto.</param>
    ''' <param name="p_curriculo">Currículo.</param>
    ''' <param name="p_nombreUsuario">Nombre de usuario.</param>
    ''' <param name="p_puesto">Código del puesto.</param>
    ''' <returns>Contraseña del usuario.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 14/06/2010, Modificado: 15/06/2010</remarks>
    Public Shared Function usuarioRegistrar(ByVal p_tipoId As String, ByVal p_identificacion As String, ByVal p_nombre As String, _
                                ByVal p_primerApellido As String, ByVal p_segundoApellido As String, ByVal p_genero As String, _
                                ByVal p_fechaNacimiento As Date, ByVal p_correo As String, ByVal p_telefono As String, _
                                ByVal p_rol As Integer, ByVal p_foto As Bitmap, ByVal p_curriculo As String, _
                                ByVal p_nombreUsuario As String, ByVal p_puesto As Integer) As String
        Dim contrasenna As String
        Dim contrasennaEncriptada As String
        Dim genero As Boolean
        Dim foto() As Byte
        Dim curriculo() As Byte

        ' Comprobar si es empleado común no puede ser ni admin ni gerente general.
        If p_rol = 3 Then
            If p_puesto = 1 Then
                Throw New Exception("Un empleado común no puede ser gerente general.")
            ElseIf p_puesto = 2 Then
                Throw New Exception("Un empleado común no puede ser de recursos humanos.")
            End If
        End If

        ' Comprobar si es gerente general y si ya hay uno.
        If p_rol = 2 Then
            If MultiUsuario.hayGerenteGeneral() Then
                Throw New Exception("Ya hay un gerente general en el sistema.")
            End If
        End If

        ' Comprobar nombre de usuario
        If MultiUsuario.existeNombreUsuario(p_nombreUsuario) Then
            Throw New Exception("El nombre de usuario ya está en uso.")
        End If

        ' Generar contraseña
        contrasenna = New Random().Next(10000, 1000000)
        contrasennaEncriptada = Utils.encriptar(contrasenna)

        ' Cambiar género a Boolean
        genero = p_genero Is "Femenino"

        ' Transformar foto a bytes
        foto = Utils.object2Byte(p_foto)

        ' Transformar curriculo a bytes
        curriculo = Utils.object2Byte(p_curriculo)

        MultiUsuario.registrar(p_tipoId, p_identificacion, p_nombre, p_primerApellido, p_segundoApellido, _
                               p_nombreUsuario, contrasennaEncriptada, genero, p_fechaNacimiento, p_correo, p_telefono, _
                               p_rol, foto, curriculo, p_puesto)

        Return contrasenna
    End Function

    ''' <summary>
    ''' Modifica un usuario.
    ''' </summary>
    ''' <param name="p_tipoId">Tipo de identificación.</param>
    ''' <param name="p_identificacion">Identificación.</param>
    ''' <param name="p_nombre">Nombre.</param>
    ''' <param name="p_primerApellido">Primero apellido.</param>
    ''' <param name="p_segundoApellido">Segundo apellido.</param>
    ''' <param name="p_genero">Género.</param>
    ''' <param name="p_fechaNacimiento">Fecha de nacimiento.</param>
    ''' <param name="p_correo">Correo electrónico.</param>
    ''' <param name="p_telefono">Teléfono.</param>
    ''' <param name="p_rol">Código del rol.</param>
    ''' <param name="p_foto">Foto.</param>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Sub usuarioModificar(ByVal p_tipoId As String, ByVal p_identificacion As String, ByVal p_nombre As String, _
                                ByVal p_primerApellido As String, ByVal p_segundoApellido As String, ByVal p_genero As String, _
                                ByVal p_fechaNacimiento As Date, ByVal p_correo As String, ByVal p_telefono As String, _
                                ByVal p_rol As Integer, ByVal p_foto As Bitmap)
        Dim genero As Boolean
        Dim foto() As Byte
        Dim usuario As Usuario

        usuario = MultiUsuario.buscar(p_identificacion)

        ' Si es administrador y sólo queda uno, no debe permitir cambiarle el rol
        If usuario.rol = 1 And p_rol <> 1 Then
            If Not MultiUsuario.puedeEliminarAdmin() Then
                Throw New Exception("No puede cambiar el rol del último administrador.")
            End If
        End If

        ' Comprobar si es gerente general y si ya hay uno
        If p_rol = 2 Then
            If MultiUsuario.hayGerenteGeneral() Then
                Throw New Exception("Ya hay un gerente general en el sistema.")
            End If
        End If

        ' Cambiar género a Boolean
        genero = p_genero Is "Femenino"

        ' Transformar foto a bytes
        foto = Utils.object2Byte(p_foto)

        ' Asigna el puesto según el rol
        If p_rol = 1 Then
            modificarPuestoAEmpleado(p_identificacion, 2)
        ElseIf p_rol = 2 Then
            modificarPuestoAEmpleado(p_identificacion, 1)
        End If

        MultiUsuario.modificar(p_tipoId, p_identificacion, p_nombre, p_primerApellido, p_segundoApellido, _
                               genero, p_fechaNacimiento, p_correo, p_telefono, p_rol, foto)
    End Sub

    ''' <summary>
    ''' Busca un usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <returns>Datos de un usuario.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Function usuarioBuscar(ByVal p_identificacion As String) As Hashtable
        Dim usuario As Usuario

        usuario = MultiUsuario.buscar(p_identificacion)

        If usuario Is Nothing Then
            Throw New Exception("El usuario no existe.")
        End If

        Return usuario.toHashtable
    End Function

    ''' <summary>
    ''' Busca los usuarios.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <param name="p_nombre">Nombre y/o apellidos.</param>
    ''' <returns>Lista de datos de usuarios.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 19/06/2010, Modificado: 19/06/2010</remarks>
    Public Shared Function usuarioBuscar(ByVal p_identificacion As String, ByVal p_nombre As String) As List(Of Hashtable)
        Dim usuarios As New List(Of Hashtable)
        Dim usuarioTemp As Hashtable
        Dim usuariosObj As List(Of Usuario)

        usuariosObj = MultiUsuario.buscar(p_identificacion, p_nombre)

        For Each usuario As Usuario In usuariosObj
            Dim nombreDepartamento As String = Nothing

            ' Carga el departamento del puesto del usuario si es que tiene
            If Not usuario.puesto Is Nothing Then
                Dim departamento As Departamento = Nothing
                departamento = MultiDepartamento.buscarPorPuesto(usuario.puesto.codigo)
                nombreDepartamento = departamento.nombre
            End If

            usuarioTemp = usuario.toHashtable ' Lo pasa a Hashtable
            usuarioTemp.Add("departamento", nombreDepartamento) ' Agrega el departamento al Hashtable

            usuarios.Add(usuarioTemp)
        Next

        Return usuarios
    End Function

    ''' <summary>
    ''' Obtiene la foto del usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <returns>Foto del usuario.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Function usuarioObtenerFoto(ByVal p_identificacion As String) As Bitmap
        Return MultiUsuario.obtenerFoto(p_identificacion)
    End Function

    ''' <summary>
    ''' Obtiene los datos del usuario actual.
    ''' </summary>
    ''' <returns>Datos del usuario.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Function usuarioActual() As Hashtable
        Return g_usuario.toHashtable
    End Function

    ''' <summary>
    ''' Elimina un usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Sub usuarioEliminar(ByVal p_identificacion As String)
        Dim usuario As Usuario

        usuario = MultiUsuario.buscar(p_identificacion)

        ' Si es administrador y sólo queda uno, no debe eliminarlo
        If usuario.rol = 1 Then
            If Not MultiUsuario.puedeEliminarAdmin() Then
                Throw New Exception("No puede eliminar el último administrador.")
            End If
        End If

        ' Si es director de departamento que no permita eliminarlo
        If MultiUsuario.esDirectorDepartamento(p_identificacion) Then
            Throw New Exception("No puede eliminar un director de departamento.")
        End If

        MultiUsuario.eliminar(p_identificacion)
    End Sub

    ''' <summary>
    ''' Cambia el estado de un usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <param name="p_estado">Estado.</param>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Sub usuarioCambiarEstado(ByVal p_identificacion As String, ByVal p_estado As Estado)
        MultiUsuario.cambiarEstado(p_identificacion, p_estado)
    End Sub

    ''' <summary>
    ''' Devuelve el desglose de la liquidación de un empleado.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <returns>Datos de la liquidación.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 22/06/2010, Modificado: 28/06/2010</remarks>
    Public Shared Function usuarioLiquidacion(ByVal p_identificacion As String) As Hashtable
        Dim liquidacion As New Hashtable
        Dim usuario As Usuario
        Dim salarios As List(Of Salario)

        Dim vacaciones As Double = 0
        Dim preaviso As Double = 0
        Dim cesantia As Double = 0
        Dim aguinaldo As Double = 0

        Dim vacacionesDisponibles As Integer = 0
        Dim salarioPorDia As Double = 0
        Dim annosLaborados As Integer = 0

        usuario = MultiUsuario.buscar(p_identificacion)
        salarios = MultiSalario.buscar(p_identificacion)

        ' TODO: Optimizar el cálculo de salario por día (de un año) y asegurarme que está bien.
        Dim i As Integer = 0
        For Each salario As Salario In salarios
            salarioPorDia += salario.salarioNetoS
            i += 1

            If i >= 12 Then
                Exit For ' WTF?!. Sí, luego lo mejoro xDDD
            End If
        Next

        If salarios.Count > 0 Then
            salarioPorDia = (salarioPorDia / salarios.Count) / 30
        End If

        If (Date.Now.Year - usuario.fechaIngreso.Year) = 0 Then
            vacacionesDisponibles = Date.Now.Month - usuario.fechaIngreso.Month ' Cuántos meses lleva trabajando.
            vacacionesDisponibles += 1 ' Basta con estar en el mes, no tenerlo terminado.
        Else
            vacacionesDisponibles = Date.Now.Month ' 1 día por mes.
        End If

        vacacionesDisponibles -= usuario.vacaciones ' Vacaciones que puede utilizar menos las ya utilizadas.

        annosLaborados = Date.Now.Year - usuario.fechaIngreso.Year

        ' Calcular vacaciones
        vacaciones = salarioPorDia * vacacionesDisponibles

        ' Calcular preaviso
        preaviso = salarioPorDia * 30 ' Los 30 días de preaviso.

        ' Calcular cesantia
        Select Case annosLaborados
            Case 0
                Dim mesesLaborados As Integer

                mesesLaborados = Date.Now.Month - usuario.fechaIngreso.Month

                If mesesLaborados > 6 Then
                    cesantia = 14 * salarioPorDia
                ElseIf mesesLaborados > 3 Then
                    cesantia = 7 * salarioPorDia
                End If
            Case 1
                cesantia = (19.5 * annosLaborados) * salarioPorDia
            Case 2
                cesantia = (20 * annosLaborados) * salarioPorDia
            Case 3
                cesantia = (20.5 * annosLaborados) * salarioPorDia
            Case 4
                cesantia = (21 * annosLaborados) * salarioPorDia
            Case 5
                cesantia = (21.24 * annosLaborados) * salarioPorDia
            Case 6
                cesantia = (21.5 * annosLaborados) * salarioPorDia
            Case 7, 8, 9
                cesantia = (22 * annosLaborados) * salarioPorDia
            Case 10
                cesantia = (21.5 * annosLaborados) * salarioPorDia
            Case 11
                cesantia = (21 * annosLaborados) * salarioPorDia
            Case 12
                cesantia = (20.5 * annosLaborados) * salarioPorDia
            Case Else ' 13 años o más.
                cesantia = (20 * annosLaborados) * salarioPorDia
        End Select

        ' TODO: Calcular aguinaldo
        aguinaldo = 30 * salarioPorDia ' Se paga un mes.

        liquidacion("vacaciones") = vacaciones
        liquidacion("preaviso") = preaviso
        liquidacion("cesantia") = cesantia
        liquidacion("aguinaldo") = aguinaldo
        liquidacion("total") = vacaciones + preaviso + cesantia + aguinaldo

        Return liquidacion
    End Function

    ''' <summary>
    ''' Liquida un empleado.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 22/06/2010, Modificado: 22/06/2010</remarks>
    Public Shared Sub usuarioLiquidar(ByVal p_identificacion As String)
        Dim liquidacion As Hashtable
        Dim usuario As Usuario

        usuario = MultiUsuario.buscar(p_identificacion)

        ' Si es administrador y sólo queda uno, no debe eliminarlo
        If usuario.rol = 1 Then
            If Not MultiUsuario.puedeEliminarAdmin() Then
                Throw New Exception("No puede liquidar el último administrador.")
            End If
        End If

        ' Si es director de departamento que no permita liquidarlo
        If MultiUsuario.esDirectorDepartamento(p_identificacion) Then
            Throw New Exception("No puede liquidar un director de departamento.")
        End If

        liquidacion = usuarioLiquidacion(p_identificacion)

        MultiUsuario.liquidar(p_identificacion, liquidacion("vacaciones"), liquidacion("preaviso"), _
                              liquidacion("cesantia"), liquidacion("aguinaldo"))
        MultiUsuario.eliminar(p_identificacion)
    End Sub

    ''' <summary>
    ''' Modifica las vacaciones de un empleado.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <param name="p_vacaciones">Número de vacaciones utilizadas.</param>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 23/06/2010, Modificado: 23/06/2010</remarks>
    Public Shared Sub usuarioModificarVacaciones(ByVal p_identificacion As String, ByVal p_vacaciones As Integer)
        Dim usuario As Usuario
        Dim vacacionesDisponibles As Integer

        usuario = MultiUsuario.buscar(p_identificacion)

        If (Date.Now.Year - usuario.fechaIngreso.Year) = 0 Then
            vacacionesDisponibles = Date.Now.Month - usuario.fechaIngreso.Month ' Cuántos meses lleva trabajando.
            vacacionesDisponibles += 1 ' Basta con estar en el mes, no tenerlo terminado.
        Else
            vacacionesDisponibles = Date.Now.Month ' 1 día por mes.
        End If

        If p_vacaciones > vacacionesDisponibles Then
            Throw New Exception("Tiene " & vacacionesDisponibles & " día(s) de vacacion(es) disponible(s) hasta ahora. No se puede sobrepasar.")
        End If

        MultiUsuario.modificarVacaciones(p_identificacion, p_vacaciones)
    End Sub

    ''' <summary>
    ''' Verifica si el usuario tiene el permiso indicado.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <param name="p_permiso">Código del permiso.</param>
    ''' <returns>Si el usuario tiene el permiso.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 27/04/2010, Modificado: 27/04/2010</remarks>
    Public Shared Function usuarioTienePermiso(ByVal p_identificacion As String, ByVal p_permiso As Integer) As Boolean
        Dim tiene As Boolean = False

        If p_identificacion <> Nothing Then
            tiene = MultiUsuario.tienePermiso(p_identificacion, p_permiso)
        End If

        Return tiene
    End Function

    ''' <summary>
    ''' Identifica si el usuario existe.
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario.</param>
    ''' <param name="p_contrasenna">Contraseña.</param>
    ''' <returns>Datos del usuario identificado.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 19/06/2010, Modificado: 19/06/2010</remarks>
    Public Shared Function usuarioIdentificar(ByVal p_nombreUsuario As String, ByVal p_contrasenna As String) As Hashtable
        Dim usuario As Usuario

        usuario = MultiUsuario.identificar(p_nombreUsuario, Utils.encriptar(p_contrasenna))

        If usuario Is Nothing Then
            Throw New Exception("El nombre de usuario y contraseña no coinciden.")
        End If

        g_usuario = usuario

        Return usuario.toHashtable()
    End Function

    ''' <summary>
    ''' Cierra la sesión de un usuario.
    ''' </summary>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Sub usuarioCerrarSesion()
        If Not g_usuario Is Nothing Then
            g_usuario = Nothing
        End If
    End Sub

    ''' <summary>
    ''' Devuelve todos los roles del sistema.
    ''' </summary>
    ''' <returns>Todos los roles.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 20/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Function rolBuscar() As List(Of Hashtable)
        Return MultiRol.buscar()
    End Function

    ''' <summary>
    ''' Obtiene todos los departamentos.
    ''' </summary>
    ''' <returns>Datos de todos los departamentos.</returns>
    ''' <remarks>Creado por: Elías Baldioceda, Fecha: 27/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Function departamentosTodos() As List(Of Hashtable)
        Dim departamentos As New List(Of Hashtable)

        For Each departamento As Departamento In MultiDepartamento.buscar("", "")
            departamentos.Add(departamento.toHashtable)
        Next

        Return departamentos
    End Function
#End Region

#Region "David Murillo"

#Region "departamento"

    ''' <summary>
    ''' Registra un departamento
    ''' </summary>
    ''' <param name="p_nombre">Nombre del departamento</param>
    ''' <param name="p_descripcion">Descripción del departamento</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub departamentoRegistrar(ByVal p_nombre As String, ByVal p_descripcion As String)

        MultiDepartamento.registrar(p_nombre, p_descripcion)

    End Sub

    ''' <summary>
    ''' Busca un departamento, puede ser por código o por nombre.
    ''' </summary>
    ''' <param name="p_codigo">Código del departamento</param>
    ''' <param name="p_nombre">Nombre del departamento</param>
    ''' <returns>Lista con los datos de los departamentos</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function departamentoBuscar(ByVal p_codigo As String, ByVal p_nombre As String) As List(Of Hashtable)

        Dim departamentos As List(Of Departamento)
        Dim datosDepartamento As New List(Of Hashtable)

        departamentos = MultiDepartamento.buscar(p_codigo, p_nombre)

        For Each dep As Departamento In departamentos
            datosDepartamento.Add(dep.toHashtable)
        Next

        Return datosDepartamento

    End Function

    ''' <summary>
    ''' Elimina un departamento. Se hace un eliminado lógico. 
    ''' </summary>
    ''' <param name="p_codigo">Código del departamento a eliminar</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 06/07/2010</remarks>
    Public Shared Function departamentoEliminar(ByVal p_codigo As String) As Boolean

        Dim codNivel As Integer
        Dim codPuesto As Integer

        If Not MultiNivel.listarPorDepartamento(p_codigo).Count = 0 Then

            For Each nivel In MultiNivel.listarPorDepartamento(p_codigo)

                codNivel = nivel.codigo

                If Not MultiPuesto.listarPuestosPorCodigoNivelLP(codNivel).Count = 0 Then

                    For Each puesto In MultiPuesto.listarPuestosPorCodigoNivelLP(codNivel)

                        codPuesto = puesto.Codigo

                        If MultiUsuario.revisarUsuarioEnPuesto(codPuesto) Then

                            Return MultiUsuario.revisarUsuarioEnPuesto(codPuesto)

                        Else
                            MultiDepartamento.eliminar(p_codigo)
                            Return False
                        End If

                    Next

                Else

                    MultiDepartamento.eliminar(p_codigo)
                    Return False

                End If

            Next

        Else

            MultiDepartamento.eliminar(p_codigo)
            Return False

        End If

        Return False

    End Function

    ''' <summary>
    ''' Permite modificar los datos de un departamento
    ''' </summary>
    ''' <param name="p_codigo">Código del departamento</param>
    ''' <param name="p_nombre">Nombre del departamento</param>
    ''' <param name="p_descripcion">Descripción del departamento</param>
    ''' <param name="p_director">Cédula del director(jefe)</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub departamentoModificar(ByVal p_codigo As String, ByVal p_nombre As String, ByVal p_descripcion As String, ByVal p_director As String)

        MultiDepartamento.modificar(p_codigo, p_nombre, p_descripcion, p_director)

    End Sub


#End Region

#Region "cargas Sociales"

    ''' <summary>
    ''' Actualiza las cargas sociales
    ''' </summary>
    ''' <param name="p_ccssPat">Porcentaje a la CCSS</param>
    ''' <param name="p_ccssTrab">Porcentaje de reducción al trabajador</param>
    ''' <param name="p_otrosPat">Otras deducciones al patrono</param>
    ''' <param name="p_otrosTrab">Otras deducciones al trabajador</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub actualizarCargaSocial(ByVal p_ccssPat As Double, ByVal p_ccssTrab As Double, ByVal p_otrosPat As Double, ByVal p_otrosTrab As Double)

        MultiCargasSociales.actualizar(p_ccssPat, p_ccssTrab, p_otrosPat, p_otrosTrab)

    End Sub

    ''' <summary>
    ''' Busca las cargas sociales
    ''' </summary>
    ''' <returns>Lista con los datos de las cargas sociales</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function cargaSocialBuscar() As List(Of Hashtable)

        Dim listaCargaSocial As List(Of CargasSociales)
        Dim datosCargas As New List(Of Hashtable)

        listaCargaSocial = MultiCargasSociales.buscar()

        For Each carga As CargasSociales In listaCargaSocial
            datosCargas.Add(carga.toHashtable)
        Next

        Return datosCargas

    End Function

#End Region

#Region "modificar periodo cv"

    ''' <summary>
    ''' Modifica el periodo de actualización del curriculo vitae
    ''' </summary>
    ''' <param name="p_dias">Cantidad de dias del periodo</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Sub periodoCVModificar(ByVal p_dias As String)

        MultiConfiguracion.modificarPeriodoCV(p_dias)

    End Sub

    ''' <summary>
    ''' Modifica el periodo de actualización del curriculo vitae
    ''' </summary>
    ''' <param name="p_fechaNueva">Cantidad de dias del periodo</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Sub modificarPeriodoFechaActualizacionCV(ByVal p_fechaNueva As String)

        MultiConfiguracion.modificarFechaActualizacionCV(p_fechaNueva)

    End Sub

    ''' <summary>
    ''' Obtiene la fecha del periodo de actualización del curriculo vitae
    ''' almacenada en el sistema
    ''' </summary>
    ''' <returns>Fecha de periodo de actualización</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function periodoCVObtenerFecha() As String

        Dim fechaPeriodoCV As String

        fechaPeriodoCV = MultiConfiguracion.obtenerFechaPeriodoCV

        Return fechaPeriodoCV

    End Function

    ''' <summary>
    ''' Convierte un periodo dado en días, la opcion serian dias,meses,años.
    ''' </summary>
    ''' <param name="p_periodo">Periodo</param>
    ''' <param name="p_opcion">Opcion</param>
    ''' <returns>Cantidad en días</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function convertirADias(ByVal p_periodo As String, ByVal p_opcion As String) As Integer

        Dim dias As Integer

        Select Case p_opcion

            Case "Día"

                dias = p_periodo

            Case "Mes"

                dias = p_periodo * 30

            Case "Año"

                dias = p_periodo * 365

        End Select

        Return dias

    End Function

    ''' <summary>
    ''' Actualiza el periodo en dias para actualizar el curriculo y la fecha limite
    ''' en que se debe actualizar el curriculo
    ''' </summary>
    ''' <param name="p_dias">Dias</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub actualizarPeriodoCV(ByVal p_dias As Integer)

        Dim fechaActual As Date

        fechaActual = periodoCVObtenerFecha()
        fechaActual = fechaActual.AddDays(p_dias)
        periodoCVModificar(p_dias)
        modificarPeriodoFechaActualizacionCV(fechaActual)

    End Sub

#End Region

#Region "modificar Contrasena"

    ''' <summary>
    ''' Valida la contraseña que el usuario ingresa con la ya almacenada en el sistema
    ''' </summary>
    ''' <param name="p_contrasennaVieja">Contraseña antigua</param>
    ''' <param name="p_contrasennaNueva">Contraseña nueva</param>
    ''' <param name="p_idUsuario">Cédula del usuario</param>
    ''' <returns>True si las contraseñas son iguales, falso si no</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function validarContrasenna(ByVal p_contrasennaVieja As String, ByVal p_contrasennaNueva As String, ByVal p_idUsuario As String) As Boolean

        Dim igual As Boolean = False
        Dim passEncriptado As String
        Dim passUsuario As String

        passEncriptado = Utils.encriptar(p_contrasennaVieja)

        passUsuario = usuarioObtenerContrasenna(p_idUsuario)

        If String.Equals(passUsuario, passEncriptado) = True Then
            igual = True
            Return igual
        Else
            Return igual
        End If

    End Function

    ''' <summary>
    ''' Modifica la contraseña de un usuario
    ''' </summary>
    ''' <param name="p_contrasennaNueva">Contraseña nueva</param>
    ''' <param name="p_id">Cédula del usuario</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub usuarioModificarContrasenna(ByVal p_contrasennaNueva As String, ByVal p_id As String)

        Dim passEncriptado As String

        passEncriptado = Utils.encriptar(p_contrasennaNueva)

        MultiUsuario.modificarContrasenna(passEncriptado, p_id)

    End Sub

    ''' <summary>
    ''' Retorna la contraseña de un usuario
    ''' </summary>
    ''' <param name="p_idUsuario">Cédula del usuario</param>
    ''' <returns>Contraseña encriptada del usuario</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Function usuarioObtenerContrasenna(ByVal p_idUsuario As String) As String

        Dim passUsuario As String

        passUsuario = MultiUsuario.obtenerContrasenna(p_idUsuario)

        Return passUsuario

    End Function



#End Region

#Region "recuperar contrasena"

    ''' <summary>
    ''' Obtiene la fecha de nacimiento de un usuario
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario</param>
    ''' <returns>Fecha de nacimiento</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioObtenerFechaNac(ByVal p_nombreUsuario As String) As Date

        Dim fechaNac As Date

        fechaNac = MultiUsuario.obtenerFechaNacimiento(p_nombreUsuario)

        Return fechaNac

    End Function

    ''' <summary>
    ''' Retorna el correo electrónico de un usuario
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario</param>
    ''' <returns>Correo electronico</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioObtenerCorreo(ByVal p_nombreUsuario As String) As String

        Dim correo As String

        correo = MultiUsuario.obtenerCorreo(p_nombreUsuario)

        Return correo

    End Function

    ''' <summary>
    ''' Genera los datos que va a tener el correo electrónico de recuperar la contraseña
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre del usuario</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Sub usuarioRecuperarContrasenna(ByVal p_nombreUsuario As String)

        Dim asunto As String
        Dim contenido As String
        Dim contrasennaNueva As String
        Dim contrasennaEncrip As String

        contrasennaNueva = generarContrasenna()

        asunto = "Recuperación de contraseña sistema OpenRH"
        contenido = "Este correo a sido enviado por el administrador del sistema OpenRH " & vbCrLf & _
        "Su nueva contraseña del sistema es: " & contrasennaNueva

        enviarCorreo(asunto, contenido, p_nombreUsuario)
        contrasennaEncrip = Utils.encriptar(contrasennaNueva)
        MultiUsuario.actualizarContrasenna(contrasennaEncrip, p_nombreUsuario)

    End Sub

    ''' <summary>
    ''' Envia un correo al usuario
    ''' </summary>
    ''' <param name="p_asunto">Asunto del correo</param>
    ''' <param name="p_contenido">Contenido del correo</param>
    ''' <param name="p_nombreUsuario">Nombre del usuario</param>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Sub enviarCorreo(ByVal p_asunto As String, ByVal p_contenido As String, ByVal p_nombreUsuario As String)

        Dim SMTP As String = "smtp.gmail.com"
        Dim usuarioCorreo As String = "rrhh.utecnologica@gmail.com"
        Dim contrasennaCorreo As String = "softca2010"
        Dim puerto As Integer = "587"

        Dim correoUsuario As String
        Dim contenido As String
        Dim asunto As String

        correoUsuario = usuarioObtenerCorreo(p_nombreUsuario)
        asunto = p_asunto
        contenido = p_contenido

        Dim correo As New System.Net.Mail.MailMessage()
        correo.From = New System.Net.Mail.MailAddress(usuarioCorreo)
        correo.Subject = asunto
        correo.To.Add(correoUsuario)
        correo.Body = contenido

        Dim servidor As New System.Net.Mail.SmtpClient
        servidor.Host = SMTP
        servidor.Port = puerto
        servidor.EnableSsl = True
        servidor.Credentials = New System.Net.NetworkCredential(usuarioCorreo, contrasennaCorreo)

        Try
            servidor.Send(correo)
        Catch
            Throw New Exception("Correo no enviado debido a problemas de conexión.")
        End Try

    End Sub

    ''' <summary>
    ''' Genera una contraseña
    ''' </summary>
    ''' <returns>Contraseña</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Private Shared Function generarContrasenna() As String

        Dim contrasenna As String

        contrasenna = New Random().Next(10000, 1000000)

        Return contrasenna

    End Function




#End Region

#Region "usuario"

    ''' <summary>
    ''' Verifica si el nombre de usuario ya existe en el sistema
    ''' </summary>
    ''' <param name="p_nombreUsuario">Nombre de usuario</param>
    ''' <returns>True si existe, false si no</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioExisteNombreUsuario(ByVal p_nombreUsuario As String) As Boolean

        Return MultiUsuario.existeNombreUsuario(p_nombreUsuario)

    End Function

    ''' <summary>
    ''' Busca todos los directores(jefes)
    ''' </summary>
    ''' <returns>Lista con los datos de los directores</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioBuscarDirectores() As List(Of Hashtable)

        Dim directores As New List(Of Hashtable)
        Dim directorHash As Hashtable
        Dim listaDirectores As List(Of Usuario)

        listaDirectores = MultiUsuario.buscarDirectores

        For Each dir As Usuario In listaDirectores
            directorHash = dir.toHashtable
            directores.Add(directorHash)
        Next

        Return directores

    End Function


#End Region

#Region "curriculo"

    ''' <summary>
    ''' Obtiene el currículo del usuario.
    ''' </summary>
    ''' <param name="p_identificacion">Número de identificación.</param>
    ''' <returns>Currículo del usuario.</returns>
    ''' <remarks>Creado por: David Murillo, Creado: 12/06/2010, Modificado: 30/06/2010</remarks>
    Public Shared Function usuarioObtenerCurriculo(ByVal p_identificacion As String) As Word.Document
        Return MultiUsuario.obtenerCurriculo(p_identificacion)
    End Function


#End Region

#End Region

#Region "Roberto"

    ''' <summary>
    ''' Registra una cuenta contable.
    ''' </summary>
    ''' <param name="p_codigoCuenta">Codigo de la cuenta contable.</param>
    ''' <param name="p_descripcion">Descripción de la cuenta contable.</param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 15/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Sub registrarCuenta(ByVal p_codigoCuenta As String, ByVal p_descripcion As String)
        MultiCuentaContable.agregar(p_codigoCuenta, p_descripcion)
    End Sub

    ''' <summary>
    ''' Consulta las cuentas contables por aproximacion de codigo.
    ''' </summary>
    ''' <param name="p_codigo">Codigo o aproximacion de codigo con el que se evalua la busqueda.</param>
    ''' <returns>Lista que contiene los datos de todas las cuentas resultantes de la busqueda.</returns>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 15/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Function consultarCuenta(ByVal p_codigo As String) As List(Of Hashtable)

        Dim listaCuentas As List(Of CuentaContable)

        listaCuentas = MultiCuentaContable.consultar(p_codigo)

        Dim listaDatos As New List(Of Hashtable)
        Dim datosCuenta As Hashtable

        For Each cuenta As CuentaContable In listaCuentas
            datosCuenta = cuenta.toHashTable(cuenta)
            listaDatos.Add(datosCuenta)
        Next

        Return listaDatos

    End Function

    ''' <summary>
    ''' Modifica una cuenta contable especifica.
    ''' </summary>
    ''' <param name="p_codigoCuenta">Codigo de cuenta contable a modificar.</param>
    ''' <param name="p_descripcion">Descripcion de la cuenta a modificar.</param>
    ''' <param name="p_saldo">Saldo de la cuenta a modificar. </param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 15/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Sub modificarCuenta(ByVal p_codigoCuenta As String, ByVal p_descripcion As String, ByVal p_saldo As Double)
        MultiCuentaContable.modificar(p_codigoCuenta, p_descripcion, p_saldo)
    End Sub
    ''' <summary>
    ''' Elimina una cuenta contable especifica
    ''' </summary>
    ''' <param name="p_codigoCuenta">Codigo de la cuenta contable a eliminar.</param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 15/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Sub eliminarCuenta(ByVal p_codigoCuenta As String)
        MultiCuentaContable.eliminar(p_codigoCuenta)
    End Sub
    ''' <summary>
    ''' Agrega una meta a un empleado especifico.
    ''' </summary>
    ''' <param name="p_codigoEmpleado">Codigo del empleado al cual se le agregara la meta.</param>
    ''' <param name="p_descripcion">Descripcion de la meta.</param>
    ''' <param name="p_fechaInicio">Fecha de inicio de la meta.</param>
    ''' <param name="p_fechaEsperada">Fecha Esperada para la finalizacion de la meta.</param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 19/06/2010, Modificado: 20/06/2010</remarks>
    Public Shared Sub agregarMeta(ByVal p_codigoEmpleado As String, ByVal p_descripcion As String, ByVal p_fechaInicio As Date, ByVal p_fechaEsperada As Date)
        MultiMeta.agregar(p_codigoEmpleado, p_descripcion, p_fechaInicio, p_fechaEsperada)
    End Sub

    ''' <summary>
    ''' Consulta todas las metas de un empleado en especifico.
    ''' </summary>
    ''' <param name="p_codigoEmpleado">Codigo del empleado del cual se buscaran las metas.</param>
    ''' <returns>Lista de datos de las metas del empleado.</returns>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 19/06/2010, Modificado: 19/06/2010</remarks>
    Public Shared Function consultarMetas(ByVal p_codigoEmpleado As String) As List(Of Hashtable)
        Dim listaMetas As List(Of Meta)

        listaMetas = MultiMeta.consultarPorEmpleado(p_codigoEmpleado)

        Dim listaDatos As New List(Of Hashtable)
        Dim datosMeta As Hashtable

        For Each meta As Meta In listaMetas
            datosMeta = meta.toHashTable(meta)
            listaDatos.Add(datosMeta)
        Next

        Return listaDatos
    End Function

    ''' <summary>
    ''' Modifica una meta especifica.
    ''' </summary>
    ''' <param name="p_codigo">Codigo de la meta a modificar.</param>
    ''' <param name="p_descripcion">Descripcion de la meta.</param>
    ''' <param name="p_fechaInicio">Fecha de inicio de la meta.</param>
    ''' <param name="p_fechaEsperada">Fecha esperada para la finalizacion de la meta.</param>
    ''' <param name="p_fechaReal">Fecha real en la que se concluyo la meta.</param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 19/06/2010, Modificado: 21/06/2010</remarks>
    Public Shared Sub modificarMeta(ByVal p_codigo As Integer, ByVal p_descripcion As String, ByVal p_fechaInicio As Date, ByVal p_fechaEsperada As Date, ByVal p_fechaReal As Date)
        MultiMeta.modificar(p_codigo, p_descripcion, p_fechaInicio, p_fechaEsperada, p_fechaReal)
    End Sub

    ''' <summary>
    ''' Eliminar una meta especifica.
    ''' </summary>
    ''' <param name="p_codigo">Codigo de la meta a eliminar.</param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 19/06/2010</remarks>
    Public Shared Sub eliminarMeta(ByVal p_codigo As Integer)
        MultiMeta.eliminar(p_codigo)
    End Sub

    ''' <summary>
    ''' Consulta los puestos
    ''' </summary>
    ''' <param name="p_codigoDepartamento">Codigo del Departamento.</param>
    ''' <returns>Lista con los datos de los puestos del departamento.</returns>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 27/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Function listarPuestosPorDepartamento(ByVal p_codigoDepartamento As Integer) As List(Of Hashtable)
        Dim listaNiveles As List(Of Nivel)
        Dim listaPuestosDeNivel As List(Of Puesto)
        Dim listaDatos As New List(Of Hashtable)

        listaNiveles = consultarNivelesPorDepartamento(p_codigoDepartamento)

        For Each nivel As Nivel In listaNiveles
            listaPuestosDeNivel = MultiPuesto.consultarPuestosPorNivel(nivel.codigo())

            For Each puesto As Puesto In listaPuestosDeNivel
                listaDatos.Add(puestoToHash(puesto))
            Next
        Next

        Return listaDatos
    End Function

    ''' <summary>
    ''' Consultar los niveles de una departamento
    ''' </summary>
    ''' <param name="p_codigoDepartamento">Codigo del departamento.</param>
    ''' <returns>Lista con los niveles de un departamento.</returns>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 27/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Function consultarNivelesPorDepartamento(ByVal p_codigoDepartamento As Integer) As List(Of Nivel)
        Dim listaNiveles As New List(Of Nivel)
        listaNiveles = MultiNivel.listarPorDepartamento(p_codigoDepartamento)
        Return listaNiveles
    End Function
    ''' <summary>
    ''' Retornar los datos de codigo y nombre de puesto.
    ''' </summary>
    ''' <param name="puesto">Puesto.</param>
    ''' <returns>Hashtable con los datos del puesto.</returns>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 27/06/2010, Modificado: 27/06/2010</remarks>
    Private Shared Function puestoToHash(ByVal puesto As Puesto) As Hashtable
        Dim datosPuesto As New Hashtable

        datosPuesto.Add("codigo", puesto.codigo())
        datosPuesto.Add("nombre", puesto.nombre())

        Return datosPuesto
    End Function
    ''' <summary>
    ''' Modificar el puesto de un empleado.
    ''' </summary>
    ''' <param name="p_codigoEmpleado">Codigo Empleado.</param>
    ''' <param name="p_codigoPuesto">Codigo Puesto.</param>
    ''' <remarks>Creado Por: Roberto Fiatt, Fecha: 27/06/2010, Modificado: 27/06/2010</remarks>
    Public Shared Sub modificarPuestoAEmpleado(ByVal p_codigoEmpleado As String, ByVal p_codigoPuesto As Integer)
        MultiUsuario.modificarPuestoEmpleado(p_codigoEmpleado, p_codigoPuesto)
    End Sub

#End Region

#Region "chaves"

    ''' <summary>
    ''' Lista los departamentos.
    ''' </summary>
    ''' <returns> lista con departamentos
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function listarDepartamentos() As List(Of Hashtable)
        Dim lista = MultiDepartamento.buscar("", "")
        Dim listaHash As New List(Of Hashtable)
        For Each obj As Departamento In lista
            listaHash.Add(CType(obj, Departamento).toHashTable)
        Next
        Return listaHash
    End Function

    ''' <summary>
    ''' Agrega un nivel
    ''' </summary>
    ''' <param name="p_codigoDepartamento">codigo departamento</param>
    ''' <param name="p_nivel">Nivel</param>
    ''' <param name="p_salarioMaximo">salarioMaximo</param>
    ''' <param name="p_salarioMinimo">salarioMinimo</param>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub agregarNivel(ByVal p_codigoDepartamento As String, ByVal p_nivel As String, _
                   ByVal p_salarioMinimo As String, ByVal p_salarioMaximo As String)
        MultiNivel.crear(CType(p_codigoDepartamento, Integer), CType(p_nivel, Integer), _
                         CType(p_salarioMinimo, Double), CType(p_salarioMaximo, Double))
    End Sub

    ''' <summary>
    ''' Obtiene un nivel
    ''' </summary>
    ''' <param name="p_codigo">codigo del nivel</param>
    ''' <returns>un hashtable con los datos de un nuvel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerNivel(ByVal p_codigo As String) As Hashtable
        Dim objNivel = MultiNivel.obtener(CType(p_codigo, Integer))
        Return objNivel.toHashTable
    End Function

    ''' <summary>
    ''' Obtiene una lista con los niveles de un departamento.
    ''' </summary>
    ''' <param name="p_codigoDepartamento">codigo del departamento.</param>
    ''' <returns>Una lista con los niveles
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function listarNivelesPorDepartamento(ByVal p_codigoDepartamento As Integer) As List(Of Hashtable)
        Dim listaNiveles = MultiNivel.listarPorDepartamento(p_codigoDepartamento)
        Dim listaHash As New List(Of Hashtable)
        For Each obj As Nivel In listaNiveles
            listaHash.Add(obj.toHashTable())
        Next
        Return listaHash
    End Function

    ''' <summary>
    ''' Obtiene el nombre de un departamento
    ''' </summary>
    ''' <param name="p_codigo">codigo del dept</param>
    ''' <returns>nombre del dept
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerNombreDepartamentoPorCodigo(ByVal p_codigo) As String
        Dim nomDept As String
        Dim dept As Departamento
        Dim listaDept = MultiDepartamento.buscar(p_codigo, "")
        dept = listaDept.Item(0)
        nomDept = dept.nombre
        Return nomDept
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub actualizarNivel(ByVal p_codigo As String, ByVal p_salarioMinimo As Double, ByVal p_salarioMaximo As Double)
        MultiNivel.actualizar(CType(p_codigo, Integer), p_salarioMinimo, p_salarioMaximo)
    End Sub

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function eliminarNivel(ByVal p_codigo As String) As Boolean
        Try
            MultiNivel.eliminar(CType(p_codigo, Integer))
        Catch ex As Exception
            Return False
        End Try
        Return True
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub registrarPuesto(ByVal p_nombre As String, ByVal p_descripcion As String, ByVal p_nivel As Integer, _
                                      ByVal p_tipoSalario As Integer, ByVal p_salario As String)
        MultiPuesto.crear(p_nombre, p_descripcion, p_nivel, p_tipoSalario, CType(p_salario, Double))
    End Sub

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerPuesto(ByVal p_codigo As String) As Hashtable
        Dim objPuesto As Puesto
        objPuesto = MultiPuesto.obtener(CType(p_codigo, Integer))
        Return objPuesto.toHashTable
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerNombreDepartamentoPorCodigoNivel(ByVal p_codigoNivel As Integer) As String
        Dim objNivel As Nivel
        Dim nombreDept As String
        objNivel = MultiNivel.obtener(p_codigoNivel)
        nombreDept = Gestor.obtenerNombreDepartamentoPorCodigo(objNivel.codigoDepartamento)
        Return nombreDept
    End Function

    ''' <summary>
    ''' Revisa si el nivel esta eliminado
    ''' </summary>
    ''' <param name="p_codigo">Codigo del nivel</param>
    ''' <returns>Verdadero si esta eliminado</returns>
    ''' <remarks></remarks>
    Public Shared Function revisarEliminadoNivel(ByVal p_codigo) As Boolean
        Dim elim = MultiNivel.revisarEliminado(p_codigo)
        If elim = 0 Then
            Return False
        Else
            Return True
        End If
    End Function

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="p_codigoDept"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function obtenerPrimerNivelDeDepartamento(ByVal p_codigoDept) As Integer
        Dim listaNiveles = listarNivelesPorDepartamento(p_codigoDept)
        Dim ht = listaNiveles.Item(0)
        Dim codigoNivel = ht("codigo")
        Return codigoNivel
    End Function

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="p_codigoNivel"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function revisarHayPuestosEnNivel(ByVal p_codigoNivel) As Boolean
        Dim lista = listarPuestosPorCodigoNivel(p_codigoNivel)
        If lista.Rows.Count > 0 Then
            Return True
        End If
        Return False
    End Function

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="p_codigoPuesto"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function revisarUsuarioDePuesto(ByVal p_codigoPuesto) As Integer
        Return MultiUsuario.obtenerIDUsuarioPorCodigoPuesto(p_codigoPuesto)
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function listarPuestos() As IDataReader
        Return MultiPuesto.listarDR
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function listarPuestosPorCodigoNivel(ByVal p_codigo) As DataTable
        Dim dt As New DataTable
        dt.Load(MultiPuesto.listarPuestosPorCodigoNivel(p_codigo))

        Return dt
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub eliminarPuesto(ByVal p_codigo As String)
        MultiPuesto.eliminar(CType(p_codigo, Integer))
    End Sub

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerNivelPorCodigoNivel(ByVal p_codigo) As Integer
        Dim objNivel As Nivel
        objNivel = MultiNivel.obtener(p_codigo)
        Return objNivel.nivel
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerTiposSalario() As Dictionary(Of String, Integer)
        Dim opciones = New Dictionary(Of String, Integer)()
        opciones("Fijo") = 1
        opciones("Semi-Variable") = 2
        opciones("Variable") = 3
        Return opciones
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerCodigoTipoSalario(ByVal p_tipoSalario) As String
        If p_tipoSalario = 1 Then
            Return "Fijo"
        End If
        If p_tipoSalario = 2 Then
            Return "Semi-Variable"
        End If
        If p_tipoSalario = 3 Then
            Return "Variable"
        End If
        Return ""
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub actualizarPuesto(ByVal p_codigo As Integer, ByVal p_nombre As String, ByVal p_descripcion As String, ByVal p_nivel As String, _
                              ByVal p_tipoSalario As Integer, ByVal p_salario As String)
        MultiPuesto.actualizar(p_codigo, p_nombre, p_descripcion, CType(p_nivel, Integer), p_tipoSalario, CType(p_salario, Double))
    End Sub

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Sub actualizarBonificacion(ByVal p_codigoUsuario As String, ByVal p_general As Double, ByVal p_meta As Double)
        MultiBonificacion.actualizarBonificacionGeneral(p_codigoUsuario, p_general)
        MultiBonificacion.actualizarBonificacionMeta(p_codigoUsuario, p_meta)
    End Sub

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerBonificacionGeneral(ByVal p_codigoUsuario As String) As Double
        Return MultiBonificacion.obtenerBonificacionGeneral(p_codigoUsuario)
    End Function

    ''' <summary>
    ''' Propiedad nivel
    ''' </summary>
    ''' <returns>m_nivel
    ''' </returns>
    ''' <remarks>Creado por: Manuel Chaves inicio:14/6/2010 mod:22/06/210</remarks>
    Public Shared Function obtenerBonificacionMeta(ByVal p_codigoUsuario As String) As Double
        Return MultiBonificacion.obtenerBonificacionMeta(p_codigoUsuario)
    End Function

    ''' <summary>
    ''' Revisa lso rangos
    ''' </summary>
    ''' <param name="p_codigoNivel">Codigo del nivel</param>
    ''' <param name="p_rangoMaximo">Rango maximo</param>
    ''' <returns>Booleano verdadero si el salario es mayor</returns>
    ''' <remarks></remarks>
    Public Shared Function revisarLimitesDeRangosSalariales(ByVal p_codigoNivel As Integer, ByVal p_rangoMaximo As String) As Boolean
        If p_codigoNivel = 1 Then
            Return True
        End If
        Dim rangoSuperior As Double
        Dim ht As Hashtable
        ht = Logica.Gestor.obtenerNivel(p_codigoNivel - 1)
        If rangoSuperior >= ht("salarioMaximo") Then
            Return True
        End If
        Return False
    End Function

    ''' <summary>
    ''' Obtiene el ID de un Usuario Actual
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function obtenerIDUsuarioActual() As String
        Return g_usuario.identificacion
    End Function

    ''' <summary>
    ''' Revisar Permiso
    ''' </summary>
    ''' <param name="p_permiso"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function revisarPermiso(ByVal p_permiso As Integer) As Boolean
        Dim tiene As Boolean = False
        tiene = MultiUsuario.tienePermiso(obtenerIDUsuarioActual(), p_permiso)
        Return tiene
    End Function

#End Region


End Class
